package day29.ioFile;

import java.io.*;

/**
 * 文件操作测试类
 * 该类演示了Java中基本的文件操作功能
 * 
 * File类常用方法介绍:
 * 1. 构造方法:
 *    - File(String pathname): 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
 *    - File(String parent, String child): 从父路径名字符串和子路径名字符串创建新的File实例
 *    - File(File parent, String child): 从父抽象路径名和子路径名字符串创建新的File实例
 *    - File(URI uri): 通过将给定的file:URI转换为抽象路径名来创建新的File实例
 * 
 * 2. 文件/目录创建相关方法:
 *    - boolean createNewFile(): 当且仅当具有该名称的文件尚不存在时，原子地创建一个由该抽象路径名命名的新的空文件
 *    - boolean mkdir(): 创建由此抽象路径名命名的目录
 *    - boolean mkdirs(): 创建由此抽象路径名命名的目录，包括任何必需但不存在的父目录
 * 
 * 3. 文件/目录删除相关方法:
 *    - boolean delete(): 删除由此抽象路径名表示的文件或目录
 *    - void deleteOnExit(): 在虚拟机终止时，请求删除由此抽象路径名表示的文件或目录
 * 
 * 4. 文件属性相关方法:
 *    - boolean exists(): 测试此抽象路径名表示的文件或目录是否存在
 *    - boolean isFile(): 测试此抽象路径名表示的文件是否为普通文件
 *    - boolean isDirectory(): 测试此抽象路径名表示的文件是否为目录
 *    - boolean canRead(): 测试应用程序是否可以读取由此抽象路径名表示的文件
 *    - boolean canWrite(): 测试应用程序是否可以修改由此抽象路径名表示的文件
 *    - boolean isHidden(): 测试此抽象路径名表示的文件是否为隐藏文件
 *    - long lastModified(): 返回此抽象路径名表示的文件最后一次被修改的时间
 *    - long length(): 返回由此抽象路径名表示的文件的长度
 * 
 * 5. 文件名相关方法:
 *    - String getName(): 返回由此抽象路径名表示的文件或目录的名称
 *    - String getPath(): 将此抽象路径名转换为路径名字符串
 *    - String getAbsolutePath(): 返回此抽象路径名的绝对路径名字符串
 *    - File getAbsoluteFile(): 返回此抽象路径名的绝对路径名形式
 *    - String getCanonicalPath(): 返回此抽象路径名的规范路径名字符串
 *    - File getCanonicalFile(): 返回此抽象路径名的规范路径名形式
 *    - String getParent(): 返回此抽象路径名父目录的路径名字符串
 *    - File getParentFile(): 返回此抽象路径名父目录的抽象路径名
 * 
 * 6. 列表相关方法:
 *    - String[] list(): 返回一个字符串数组，命名此抽象路径名表示的目录中的文件和目录
 *    - String[] list(FilenameFilter filter): 返回一个字符串数组，命名此抽象路径名表示的目录中满足指定过滤器的文件和目录
 *    - File[] listFiles(): 返回一个抽象路径名数组，表示此抽象路径名表示的目录中的文件
 *    - File[] listFiles(FileFilter filter): 返回一个抽象路径名数组，表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
 *    - File[] listFiles(FilenameFilter filter): 返回一个抽象路径名数组，表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
 * 
 * 7. 其他方法:
 *    - boolean renameTo(File dest): 重新命名此抽象路径名表示的文件
 *    - boolean setLastModified(long time): 设置此抽象路径名所指定的文件或目录的最后一次修改时间
 *    - boolean setReadOnly(): 标记此抽象路径名所指定的文件或目录为只读
 *    - boolean setWritable(boolean writable): 设置此抽象路径名所指定的文件或目录的写权限
 *    - boolean setReadable(boolean readable): 设置此抽象路径名所指定的文件或目录的读权限
 *    - int compareTo(File pathname): 按字母顺序比较抽象路径名与另一个抽象路径名
 *    - boolean equals(Object obj): 测试此抽象路径名与给定对象是否相等
 *    - int hashCode(): 计算此抽象路径名的哈希码
 *    - String toString(): 返回此抽象路径名的路径名字符串
 */
public class FileTest1 {
    
    public static void main(String[] args) {
        // 测试文件操作功能
        FileTest1 test = new FileTest1();
        test.testFileOperations();
    }
    
    /**
     * 测试文件的基本操作
     * 演示File类的基本使用方法，包括创建、读取、获取信息和删除文件
     */
    public void testFileOperations() {
        String fileName = "test.txt";
        String content = "这是一个测试文件\n包含多行内容\n用于演示文件操作功能";
        
        // 创建并写入文件
        createAndWriteFile(fileName, content);
        
        // 读取并显示文件内容
        System.out.println("文件内容:");
        readFile(fileName);
        
        // 获取文件信息
        getFileInfo(fileName);
        
        // 删除测试文件
        System.out.println();
        deleteFile(fileName);
    }
    
    /**
     * 创建文件并写入内容
     * 使用FileWriter将指定内容写入文件
     * @param fileName 文件名
     * @param content 写入的内容
     */
    public void createAndWriteFile(String fileName, String content) {
        try (FileWriter writer = new FileWriter(fileName)) {
            writer.write(content);
            System.out.println("文件 " + fileName + " 创建并写入成功");
        } catch (IOException e) {
            System.err.println("写入文件时出错: " + e.getMessage());
        }
    }
    
    /**
     * 读取文件内容并打印
     * 使用BufferedReader逐行读取文件内容并输出到控制台
     * @param fileName 文件名
     */
    public void readFile(String fileName) {
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.err.println("读取文件时出错: " + e.getMessage());
        }
    }
    
    /**
     * 获取并显示文件信息
     * 使用File类的各种方法获取文件的属性信息
     * 包括文件名、大小、读写权限、绝对路径等
     * @param fileName 文件名
     */
    public void getFileInfo(String fileName) {
        File file = new File(fileName);
        if (file.exists()) {
            System.out.println("\n文件信息:");
            System.out.println("文件名: " + file.getName());
            System.out.println("文件大小: " + file.length() + " 字节");
            System.out.println("是否可读: " + file.canRead());
            System.out.println("是否可写: " + file.canWrite());
            System.out.println("文件路径: " + file.getAbsolutePath());
        } else {
            System.out.println("文件不存在");
        }
    }
    
    /**
     * 删除文件
     * 使用File类的delete方法删除指定文件
     * @param fileName 文件名
     */
    public void deleteFile(String fileName) {
        File file = new File(fileName);
        if (file.delete()) {
            System.out.println("文件 " + fileName + " 删除成功");
        } else {
            System.out.println("文件删除失败");
        }
    }
}